package dao.jdbc.SqlServer;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import entidades.Categoria;

public class CategoriaDAO {

	private static CategoriaDAO instancia = null;
	
	public static CategoriaDAO getInstancia(){
		if (instancia == null){
			instancia = new CategoriaDAO();
		}
		return instancia;
	}

	/**
	 * Graba una nueva Categoria en la base de datos
	 * @param nuevoCategoria
	 */
	
	public boolean grabarCategoria(Categoria nuevaCategoria) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		if (existeCategoria(nuevaCategoria) == true){
			return false;
		}
		try{
			String query = "INSERT INTO CATEGORIACLIENTE VALUES (?)";
			Connection conexion = DataSource.obtenerConexion();
			conexion.setAutoCommit(false);
			
			stmt = conexion.prepareStatement(query);
			stmt.setString(1, nuevaCategoria.getNombre());
			
			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
			return false;
		}finally{
			DataSource.cerrarConexion(stmt);
		}
		return true;
	}
	
	private boolean existeCategoria(Categoria categoria){
		boolean resultadoConsulta = false;
		try {
			Connection connection = DataSource.obtenerConexion();
			Statement stmt = connection.createStatement();
			String aux = "\'"+categoria.getNombre()+"\'";
			String query1 = "SELECT * FROM categoriaCliente where descripcion = "+aux;
			ResultSet rs = stmt.executeQuery(query1);
			if (!rs.next()){
				resultadoConsulta = false;
			}
			else{
				resultadoConsulta = true;
			}
		}catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultadoConsulta;
	}

	public Vector<Categoria> obtenerCategorias() {
		Vector<Categoria> categorias = new Vector<Categoria>();
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM CATEGORIACLIENTE";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				Categoria cat = new Categoria(rs.getString("descripcion"));
				categorias.add(cat);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return categorias;
	}	
/*
 * La clase esta la hice al divino boton (no se en que estaba pensando), pero igualmente
 * la dejo por si llega a servir mas adelante para los informes (que es casi seguro que para 
 * eso nos va a servir).	
 */
	public Categoria obtener(int id) {
		Categoria categoria = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM CATEGORIACLIENTE WHERE nroCategoria = ?";
			Connection con = DataSource.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				categoria = new Categoria();
				categoria.setNombre(rs.getString("descripcion"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return categoria;
	}

	public void borrarCategoria(String nombreCategoria) {
		// TODO Auto-generated method stub
		Statement stmt = null;
		try {
			String query = "DELETE FROM CATEGORIACLIENTE WHERE DESCRIPCION = "+"\'"+nombreCategoria+"\'";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			stmt.execute(query); 
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(null, stmt);
		}
	}

	public void modificarCategoria(String nombreViejo, String nombreNuevo) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		try {
			Connection connection = DataSource.obtenerConexion();
			String query = "UPDATE CATEGORIACLIENTE SET DESCRIPCION = ? WHERE descripcion = "+"\'"+nombreViejo+"\'";
			stmt = connection.prepareStatement(query);
			stmt.setString(1, nombreNuevo);
			stmt.execute();

		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(null, stmt);
		}
	}
}